package com.gmgx.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
//@Aspect
public class AopByAnnotation {

    // 配一个切点 所有的通知注解 引用这个切点方法（注意括号）
    @Pointcut("execution(* com.gmgx.service.IStudentService.*(..))")
    public void p(){
        // 这是一个普普通通没有任何代码的空方法，目的为了表示 切点
    }

    @Before("p()") // 切点方法（注意括号）
    public void beforeMethod(){
        System.out.println("beforeMethod...");
    }

    @After("p()")// 切点方法
    public void afterMethod(){
        System.out.println("afterMethod...");
    }

    @AfterReturning("p()")// 切点方法
    public void afterReturningMethod(){
        System.out.println("afterReturningMethod...");
    }

    @AfterThrowing("p()")// 切点方法
    public void afterThrowingMethod(){
        System.out.println("afterThrowingMethod...");
    }

//    @Around("p()")// 切点方法
    public Object aroundMethod(ProceedingJoinPoint joinPoint){
        System.out.println("aroundMethod...");
        try {
            return joinPoint.proceed();
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
    }



}
